package com.qjc.demo.algorithm.滑动窗口209长度最小的子数组;

/**
 * 思路：滑动窗口实现，定义一个变量（窗口内总和winNums）；
 * 小于target右指针右移（窗口内总和增加），大于target左指针右移（窗口内总和减少），等于记录更新窗口的长度大小
 *
 * @ClassName: Solution
 * @Author: qjc
 * @Date: 2023/8/15 12:19
 */
public class Solution {
    // 长度最小子数组
    public static int minSubArrayLength(int target, int[] nums) {
        // 定义一个最小长度
        int result = Integer.MAX_VALUE;
        // 定义一个窗口内总和
        int winNums = 0;
        for (int l = 0, r = 0; r < nums.length; r++) {
            // r++代表右指针右移，则增加窗口内总和
            winNums += nums[r];
            // 判断窗口内总和大于target，则左指针右移
            while (winNums >= target) {
                // 先更新最小长度
                result = Math.min(result, r - l + 1);
                // 再减少窗口内总和
                winNums -= nums[l];
                // 最后左指针右移
                l++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

    public static void main(String[] args) {
        int target = 10;
        int[] nums = {1, 2, 3, 4, 5, 1, 2, 3, 4};
        // 结果是3，其实就是数组[3,4,5]
        System.out.println(minSubArrayLength(target, nums));
    }

}
